home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / OTFIRE.ZIP / fire.asm < prev    next >
Assembly Source File  |  1996-01-10  |  7KB  |  220 lines

  1. ; Fire effect in (t)asm
  2. ; By Vulture / Outlaw Triad
  3.  
  4. DOSSEG
  5. .MODEL SMALL
  6. .STACK 200h           ; 512 byte stack
  7. .286
  8. .DATA                 ; Empty
  9. .CODE
  10. JUMPS
  11.  
  12. ; === Data starts here ===
  13.  
  14. Label Palette Byte
  15.      db 0,0,0         ; Base color
  16.      d = 0
  17.      REPT 31          ; Create red-scale for fire (can be improved)
  18.         db  d,0,5
  19.         db  d,0,6
  20.         db  d,0,7
  21.         d = d + 2
  22.      ENDM
  23.  
  24. ; === VGA registers ===
  25.  
  26. Seq_Index   = 03C4h   ; Sequencer Registers Adress  ( for memory mode, etc  )
  27. CrtC_Index  = 03D4h   ; CRTC Adress Register ( for max scanline, vert retrace )
  28.  
  29. ; === Other variables ===
  30.  
  31. Label Credits Byte
  32.          db 13,10,"▄  ▄▄  ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄  ▄▄  ▄"
  33.          db 13,10,"                    - An Outlaw Triad Production (c) 1996 -",13,10
  34.          db 13,10,"                             Code∙∙∙∙∙∙∙∙∙∙Vulture" ,13,10,13,10
  35.          db 13,10,"                            -=≡ Outlaw Triad Is ≡=-",13,10
  36.          db 13,10,"    Vulture(code) ■ Dazl(gfx) ■ Troop(sysop) ■ Kr'33(code) ■ Xplorer(artist)",13,10
  37.          db 13,10,"▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄",13,10,"$"
  38.  
  39. Seed     dw   ?       ; Any number for randomness (obtained from system clock)
  40.  
  41. Xsize    equ  80      ; Number of pixels on 1 scanline / 4 (in unchained mode)
  42. Ysize    equ  100     ; Ysize
  43.  
  44. Virtual  db Xsize*Ysize DUP (0) ; To hold all data
  45.  
  46. ; === Sub-routines ===
  47.  
  48. SetVGA PROC NEAR
  49. ; === Set normal Mode 13h ===
  50.     mov     ax,0013h         ; Lineair videomode 13h  320*200*256
  51.     int     10h              ; Set the mode
  52.  
  53. ; === Disable chain4 bit ===
  54.     mov     dx,Seq_Index     ; Sequencer Address Register
  55.     mov     ax,0604h         ; 06h = 00000110b
  56.     out     dx,ax            ; Disable chain4 mode & enable extended memory
  57.  
  58. ; === Disable word / enable byte mode ===
  59.     mov     dx,CrtC_Index
  60.     mov     ax,00014h        ; Underline Location (disable dword mode)
  61.     out     dx,ax
  62.     mov     ax,0e317h        ; Mode Control (enable byte mode)
  63.     out     dx,ax
  64.  
  65. ; === Clear display memory ===
  66.     mov     dx,Seq_Index     ; Select port 03c4h
  67.     mov     ax,00f02h        ; Map Mask Register (select all planes)
  68.     out     dx,ax
  69.     xor     di,di            ; Set es:di to point to screenmem  di=0
  70.     xor     ax,ax            ; Color to store = usually black = 0
  71.     mov     cx,32768         ; 32768 words * 2 = 65536 bytes = 1 plane
  72.     rep     stosw            ; Clear all 4 planes using wordwrites
  73.  
  74. ; === Set scanline register ===
  75.     mov     ax,4109h         ; Duplicate each scan 2 times (normal)
  76.     out     dx,ax            ; (set 4009 to get into 320*400 mode)
  77.  
  78. ; === Setup palette ===
  79.     lea     si,Palette       ; Load offset palette data
  80.     mov     dx,03c8h         ; Write palette register
  81.     xor     al,al            ; Start writing at 0
  82.     out     dx,al
  83.     mov     cx,94*3          ; # of rgb values to shift
  84.     mov     dx,03c9h         ; Data register
  85.     rep     outsb
  86.  
  87.     ret
  88. SetVGA ENDP
  89.  
  90. WaitVrt PROC NEAR
  91.     mov     dx,3dah
  92. Vrt:
  93.     in      al,dx
  94.     test    al,1000b
  95.     jnz     Vrt              ; Wait until Verticle Retrace starts
  96. NoVrt:
  97.     in      al,dx
  98.     test    al,1000b
  99.     jz      NoVrt            ; Wait until Verticle Retrace ends
  100.     ret                      ; Return to main program
  101. WaitVrt ENDP
  102.  
  103. ; =================================
  104. ;  Random: generates random number
  105. ;  Input : cx = range
  106. ;  Output: dx = random number
  107. ; =================================
  108.  
  109. Random PROC NEAR             ; Reasonably random (can be improved)
  110.     mov     ax,Seed
  111.     add     ax,1234
  112.     xor     al,ah
  113.     rol     ah,1             ; Rotate left
  114.     add     ax,4321
  115.     ror     al,2             ; Rotate right
  116.     xor     ah,al
  117.     mov     Seed,ax
  118.     xor     dx,dx
  119.     div     cx
  120.     ret
  121. Random ENDP
  122.  
  123. ; === Main program ===
  124.  
  125. START:
  126.  
  127.     cld                                 ; Clear direction flag
  128.  
  129. ; === Set pointers ===
  130.     mov     ax,cs
  131.     mov     ds,ax
  132.     mov     ax,0a000h
  133.     mov     es,ax
  134.  
  135. ; === Set random seed ===
  136.     xor     ah,ah
  137.     int     1ah
  138.     mov     [Seed],dx                   ; Get random seed from clock
  139.  
  140. ; === Setup screen ===
  141.     call    SetVGA                      ; Setup unchained vga-screen
  142.  
  143. MainLoop:
  144.  
  145. ; === Put new row on bottom virtual screen ===
  146.     mov     si,offset [Virtual]
  147.     add     si,(Xsize*Ysize)-Xsize      ; si:=start last row
  148.     mov     bx,Xsize
  149.     xor     dx,dx
  150. DoLine:
  151.     mov     cx,85
  152.     call    Random                      ; Generate random number
  153.     mov     byte ptr ds:[si],dl
  154.     inc     si                          ; Next cel (Xsize cels to do)
  155.     dec     bx
  156.     jnz     DoLine
  157.  
  158. ; === Create Fire Effect ===
  159.     mov     si,offset [Virtual]
  160.     add     si,Xsize+1                  ; Start at second line
  161.     mov     cx,(Xsize*Ysize)-Xsize-1
  162. DoFire:
  163.     xor     ax,ax                       ; Reset to 0
  164.  
  165. ; === 3 pixels above current pix ===
  166.     add     al,byte ptr ds:[si-Xsize-1]
  167.     adc     ah,0                        ; Add with carry
  168.     add     al,byte ptr ds:[si-Xsize+1]
  169.     adc     ah,0
  170.     add     al,byte ptr ds:[si-Xsize]
  171.     adc     ah,0
  172. ; === 2 pixels besides current pix ===
  173.     add     al,byte ptr ds:[si-1]
  174.     adc     ah,0
  175.     add     al,byte ptr ds:[si+1]
  176.     adc     ah,0
  177. ; === 3 pixels under current pix ===
  178.     add     al,byte ptr ds:[si+Xsize-1]
  179.     adc     ah,0
  180.     add     al,byte ptr ds:[si+Xsize]
  181.     adc     ah,0
  182.     add     al,byte ptr ds:[si+Xsize+1]
  183.     adc     ah,0
  184.  
  185. ; === Divide by 3+2+3=8 to average ===
  186.     shr     ax,3
  187.     jz      Zero
  188.     dec     ax
  189. Zero:
  190.     mov     byte ptr ds:[si-Xsize],al   ; 4 pixels are filled at a time
  191.     inc     si                          ; due to unchained vga-screen
  192.     loop    DoFire
  193.  
  194. ; === Bring it all to VGA ===
  195.     call    WaitVrt                     ; Wait for retrace
  196.     mov     si,offset [Virtual]
  197.     mov     cx,(Xsize*Ysize)/2
  198.     mov     di,80*106                   ; Save first 106 lines and store
  199.     rep     movsw                       ; bottomlines in offscreen memory !!!
  200.  
  201. ; === Scan keyboard and loop ===
  202.     in      al,60h                      ; Scan keyboard
  203.     cmp     al,1                        ; Test on ESCAPE
  204.     jne     MainLoop                    ; Continue if not pressed
  205.  
  206. ; === Back to DOS ===
  207.     mov     ax,0003h
  208.     int     10h                         ; Get into 80x25 text mode
  209.     mov     ah,9
  210.     lea     dx,Credits
  211.     int     21h                         ; Print string
  212.     mov     ax,4c00h
  213.     int     21h                         ; Return control to DOS
  214.  
  215. END START                               ; The End
  216.  
  217.  
  218. ; Thanx to all people who have released fire-code before I did.
  219.  
  220. ;    -Vulture / Outlaw Triad